How are property taxes changing over time?

In this data visualization, we will be looking only at homes with the homeowner’s exemption that maintained that exemption from 2007-2016. This means homes that are sold from one primary resident to another. The “clean_data.rmd” notebook contains all the code for cleaning, subsetting, and preparing the data.

Loading libraries and the data:

So now the year the buildings have been most recently sold is AFTER the “earliest year,” which will be my proxy for “year built.”

Now I’m curious about the neighborhoods!

rr p = ggplot(data = dat_ho_2016_sub)+ geom_boxplot(aes(x = Analysis Neighborhood, y = Total Taxable Assessment))+ theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) p

rr p = ggplot(data = dat_ho_2016_sub)+ geom_boxplot(aes(x = Analysis Neighborhood, y = Total Taxable Assessment Percent Difference From 2012))+ theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) p

rr p = ggplot(data = dat_ho_2016_sub %>% filter(Current Sales Date > 2008-01-01 & Total Taxable Assessment Percent Difference From 2012 < 100 & Total Taxable Assessment Percent Difference From 2012 > 0))+ geom_boxplot(aes(x = Analysis Neighborhood, y = Total Taxable Assessment Percent Difference From 2012))+ theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) p

rr neighborhoods = unique(dat_ho_all_sub$Analysis Neighborhood) currdat = dat_ho_all_sub %>% filter(as.numeric(format(Current Sales Date,%Y)) >= 2006) pAssessTime = function(nhood){ currdat2 = currdat %>% filter(Analysis Neighborhood == nhood & as.numeric(format(Current Sales Date,%Y)) >= 2006) p = ggplot(data = currdat2) + geom_line(aes(x = Closed Roll Year, y = Total Taxable Assessment, group = Parcel Number, color = Earliest Year))+ #geom_point(aes(x = as.numeric(format(Current Sales Date,%Y)), # y = Total Taxable Assessment, # group = Parcel Number))+ scale_color_distiller(palette = )+ ggtitle(paste(nhood))+ theme_dark()#+ #facet_wrap(~as.factor(as.numeric(format(Current Sales Date,%Y)) >= 2006)) return(p) } lapply(neighborhoods, pAssessTime)

[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

[[10]]

[[11]]

[[12]]

[[13]]

[[14]]

[[15]]

[[16]]

[[17]]

[[18]]

[[19]]

[[20]]

[[21]]

[[22]]

[[23]]

[[24]]

[[25]]

[[26]]

[[27]]

[[28]]

[[29]]

[[30]]

[[31]]

[[32]]

[[33]]

[[34]]

[[35]]

[[36]]

[[37]]

[[38]]

So this shows some interesting patterns. For homes that were not sold, there is often a dip in property values starting after 2008 and reaching a minimum around 2012. This is because homeowners can have their homes reassessed if the house loses value, and there was the 2008 financial crisis. (CITE) If the housing market recovers, the house is reassessed but only to what would be maximally allowed based on the original property assessment. In houses that were sold during this time period, there are often large jumps in the assessment value. This is what I expected. The number of houses that maintained a steady property growth rate surprised me. Maybe the depressed property values after 2008 contributed to these properties not gaining greatly in value. Maybe the new owners benefitted from transfering their old property assessment (CITE). Maybe the property was sold to a child or grandchild, who would be allowed to keep the lower assessment (CITE).

(WORD THIS BETTER) I’m going to fit each property with a linear regression to see what the average increase in value per year is between 2008 and 2016. Then I can see what neighborhoods or perhaps characteristics of houses correlate with increasing or stable taxable assessments.

rr slopes = dat_ho_all_sub %>% group_by(Parcel Number) %>% summarise(slope = lm(Total Taxable Assessment~Closed Roll Year)$coefficients[[2]]) dat_ho_all_sub_slopes = slopes %>% left_join(dat_ho_all_sub, by = Number)

rr ggplot(data = slopes %>% filter(slope < 400000 & slope > -100000))+ geom_histogram(aes(x = slope), binwidth = 1000)+ scale_y_log10()

rr ggplot(data = slopes %>% filter(slope < 400000 & slope > -100000))+ geom_histogram(aes(x = slope), binwidth = 1000)

rr neighborhoods = unique(dat_ho_all_sub_slopes$Analysis Neighborhood) pAssessTime = function(nhood){ currdat = dat_ho_all_sub_slopes %>% filter(Analysis Neighborhood == nhood) p = ggplot(data = currdat) + geom_jitter(aes(x = 1, y = slope, group = Parcel Number, color = Earliest Year))+ scale_color_distiller(palette = )+ ggtitle(paste(nhood))+ theme_dark()+ facet_wrap(~as.factor(Current Sales Date >= 2006)) return(p) } lapply(neighborhoods, pAssessTime)

[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

[[10]]

[[11]]

[[12]]

[[13]]

[[14]]

[[15]]

[[16]]

[[17]]

[[18]]

[[19]]

[[20]]

[[21]]

[[22]]

[[23]]

[[24]]

[[25]]

[[26]]

[[27]]

[[28]]

[[29]]

[[30]]

[[31]]

[[32]]

[[33]]

[[34]]

[[35]]

[[36]]

[[37]]

[[38]]

rr options(digits = 15) get_lat = function(geo){ lat = strsplit(geo, [( ```

sfmap = map_data("county", region = "California") %>% filter(subregion == "san francisco")
p = ggplot()+
  geom_polygon(data = sfmap, 
               aes(x=long, y = lat))
p
currdat = dat_sub %>% filter(`Closed Roll Year` == 2016,
                                           `Slope Percent Difference` >= 0)
p = ggplot()+
  geom_point(data = currdat,
             aes(x = long,
                 y = lat,
                 color = `Slope Percent Difference`))+
  #scale_color_gradientn(trans = "log", colors = rainbow(9))+
  scale_color_distiller(palette = "Spectral", trans = "log")+
  coord_map()
p
p = ggplot()+
  geom_point(data = currdat,
             aes(x = long,
                 y = lat,
                 color = `Slope Percent Difference`))+
  scale_color_gradientn(trans = "log", colors = rev(rainbow(9)))+
  coord_map()
p

rr neighborhoods = unique(dat_ho_all_sub_slopes$Analysis Neighborhood) pLocation = function(nhood){ currdat = dat_ho_all_sub_slopes %>% filter(Analysis Neighborhood == nhood) p = ggplot(data = currdat) + geom_jitter(aes(x = 1, y = slope, group = Parcel Number, color = Earliest Year))+ scale_color_distiller(palette = )+ ggtitle(paste(nhood))+ theme_dark()+ facet_wrap(~as.factor(Current Sales Date >= 2006)) return(p) }

lapply(neighborhoods, pAssessTime)

rr dat_ho_2016_sub2 = dat_ho_2016_sub %>% filter(Total Taxable Assessment Percent Difference From 2012 > 1000 & Total Taxable Assessment <3000000)

p = ggplot(data = dat_ho_all_sub %>% filter(Parcel Number %in% dat_ho_2016_sub2$Parcel Number)) + geom_line(aes(x = Closed Roll Year, y = Total Taxable Assessment, group = Parcel Number, color = Year Property Built))+ scale_color_distiller(palette = )+ theme_dark() #theme(legend.position = ) p

pAssessEarliestDate = function(nhood){ currdat = dat_ho_all_sub %>% filter(Analysis Neighborhood == nhood) p = ggplot(data = currdat %>% filter(Parcel Number %in% dat_ho_2016_sub2$Parcel Number)) + geom_point(aes(x = Current Sales Date, y = Total Taxable Assessment, group = Parcel Number, color = Earliest Year))+ scale_x_date()+ scale_color_distiller(palette = )+ theme_dark()+ #theme(legend.position = ) return(p) } lapply(neighborhoods[1:3], pAssessEarliestDate)

p = ggplot(data = dat_ho_all_sub_slopes %>% filter(slope < 400000 & slope > 0)) + geom_point(aes(x = Earliest Year, y = Current Sales Date, color = slope))+ scale_color_distiller(palette = )+ scale_y_date() p

More questions to explore

1. Who is rent control benefiting?

  • What are the incomes of people who are in rent control?
  • What are the rents of rent control units?
  • Are people in rent control using other city programs?
  • Can I find out if some people who have rent control, own homes elsewhere?
  • Are rent controlled homes more “derelict?”
  • Do rent controlled units rent for a premium?
  • What about people without rent control. Are they more likely to have roomates?
  • Or be wealthier?
  • Or move more often?
  • Does rent control change or correlate with certain behaviors?

2. Of people who own homes:

  • How long have they been there?
  • What taxes are people paying?
  • What are the incomes of people who own?
  • Variables to explore: income, year purchased, taxes paid

3. Homes and apartments in general. What does turnover look like?

  • How often/were are homes being sold?
  • How often/were are homes sold to foreign buyers?
  • How often/where are homes put on AirBnB or VRBO as short term rentals?
  • Whats the historical trend of houses being condo converted?
LS0tCnRpdGxlOiAiU0YgQXNzZXNzb3IncyBPZmZpY2UgRGF0YSBFeHBsb3JhdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjSG93IGFyZSBwcm9wZXJ0eSB0YXhlcyBjaGFuZ2luZyBvdmVyIHRpbWU/CkluIHRoaXMgZGF0YSB2aXN1YWxpemF0aW9uLCB3ZSB3aWxsIGJlIGxvb2tpbmcgb25seSBhdCBob21lcyB3aXRoIHRoZSBob21lb3duZXIncyBleGVtcHRpb24gdGhhdCBtYWludGFpbmVkIHRoYXQgZXhlbXB0aW9uIGZyb20gMjAwNy0yMDE2LiBUaGlzIG1lYW5zIGhvbWVzIHRoYXQgYXJlIHNvbGQgZnJvbSBvbmUgcHJpbWFyeSByZXNpZGVudCB0byBhbm90aGVyLiBUaGUgImNsZWFuX2RhdGEucm1kIiBub3RlYm9vayBjb250YWlucyBhbGwgdGhlIGNvZGUgZm9yIGNsZWFuaW5nLCBzdWJzZXR0aW5nLCBhbmQgcHJlcGFyaW5nIHRoZSBkYXRhLiAKCkxvYWRpbmcgbGlicmFyaWVzIGFuZCB0aGUgZGF0YToKYGBge3IsIGNhY2hlPVRSVUUsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmRhdCA9IHJlYWRfcmRzKCIuL2RhdGEvY29tcHJlc3NlZF9hc3Nlc3NvcnNfZGF0YV9zdWJzZXQucmRzIikKYGBgCgoKCmBgYHtyfQpjdXJyZGF0ID0gZGF0ICU+JSBmaWx0ZXIoYENsb3NlZCBSb2xsIFllYXJgID09IDIwMTYpCgpwID0gZ2dwbG90KGRhdGEgPSBjdXJyZGF0KSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBgVG90YWwgVGF4YWJsZSBBc3Nlc3NtZW50YCksCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAxMDAwKQpwCgpwID0gZ2dwbG90KGRhdGEgPSBjdXJyZGF0KSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBgVG90YWwgVGF4YWJsZSBBc3Nlc3NtZW50YCksCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAuMDEpKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2ciKQpwCgpwID0gZ2dwbG90KGRhdGEgPSBjdXJyZGF0ICU+JSBmaWx0ZXIoIWlzLm5hKGBFYXJsaWVzdCBZZWFyYCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBhcy5udW1lcmljKGBFYXJsaWVzdCBZZWFyYCkpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gMSkKcAoKcCA9IGdncGxvdChkYXRhID0gY3VycmRhdCAlPiUgZmlsdGVyKCFpcy5uYShgQ3VycmVudCBTYWxlcyBEYXRlYCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBhcy5udW1lcmljKGZvcm1hdChgQ3VycmVudCBTYWxlcyBEYXRlYCwiJVkiKSkpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gMSkKcApgYGAKU28gbm93IHRoZSB5ZWFyIHRoZSBidWlsZGluZ3MgaGF2ZSBiZWVuIG1vc3QgcmVjZW50bHkgc29sZCBpcyBBRlRFUiB0aGUgImVhcmxpZXN0IHllYXIsIiB3aGljaCB3aWxsIGJlIG15IHByb3h5IGZvciAieWVhciBidWlsdC4iCgpOb3cgSSdtIGN1cmlvdXMgYWJvdXQgdGhlIG5laWdoYm9yaG9vZHMhCmBgYHtyfQpwID0gZ2dwbG90KGRhdGEgPSBkYXRfaG9fMjAxNl9zdWIpKwogIGdlb21fYm94cGxvdChhZXMoeCA9IGBBbmFseXNpcyBOZWlnaGJvcmhvb2RgLAogICAgICAgICAgICAgICB5ID0gYFRvdGFsIFRheGFibGUgQXNzZXNzbWVudGApKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKcAoKcCA9IGdncGxvdChkYXRhID0gZGF0X2hvXzIwMTZfc3ViKSsKICBnZW9tX2JveHBsb3QoYWVzKHggPSBgQW5hbHlzaXMgTmVpZ2hib3Job29kYCwKICAgICAgICAgICAgICAgeSA9IGBUb3RhbCBUYXhhYmxlIEFzc2Vzc21lbnQgUGVyY2VudCBEaWZmZXJlbmNlIEZyb20gMjAxMmApKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKcAoKcCA9IGdncGxvdChkYXRhID0gZGF0X2hvXzIwMTZfc3ViICU+JSBmaWx0ZXIoYEN1cnJlbnQgU2FsZXMgRGF0ZWAgPiAyMDA4LTAxLTAxICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVG90YWwgVGF4YWJsZSBBc3Nlc3NtZW50IFBlcmNlbnQgRGlmZmVyZW5jZSBGcm9tIDIwMTJgIDwgMTAwICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVG90YWwgVGF4YWJsZSBBc3Nlc3NtZW50IFBlcmNlbnQgRGlmZmVyZW5jZSBGcm9tIDIwMTJgID4gMCkpKwogIGdlb21fYm94cGxvdChhZXMoeCA9IGBBbmFseXNpcyBOZWlnaGJvcmhvb2RgLAogICAgICAgICAgICAgICB5ID0gYFRvdGFsIFRheGFibGUgQXNzZXNzbWVudCBQZXJjZW50IERpZmZlcmVuY2UgRnJvbSAyMDEyYCkpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKQpwCmBgYAoKYGBge3J9Cm5laWdoYm9yaG9vZHMgPSB1bmlxdWUoZGF0X2hvX2FsbF9zdWIkYEFuYWx5c2lzIE5laWdoYm9yaG9vZGApCmN1cnJkYXQgPSBkYXRfaG9fYWxsX3N1YiAlPiUgZmlsdGVyKGFzLm51bWVyaWMoZm9ybWF0KGBDdXJyZW50IFNhbGVzIERhdGVgLCIlWSIpKSA+PSAyMDA2KQoKcEFzc2Vzc1RpbWUgPSBmdW5jdGlvbihuaG9vZCl7CiAgY3VycmRhdDIgPSBjdXJyZGF0ICU+JSBmaWx0ZXIoYEFuYWx5c2lzIE5laWdoYm9yaG9vZGAgPT0gbmhvb2QgJiBhcy5udW1lcmljKGZvcm1hdChgQ3VycmVudCBTYWxlcyBEYXRlYCwiJVkiKSkgPj0gMjAwNikKICBwID0gZ2dwbG90KGRhdGEgPSBjdXJyZGF0MikgKwogICAgZ2VvbV9saW5lKGFlcyh4ID0gYENsb3NlZCBSb2xsIFllYXJgLAogICAgICAgICAgICAgICAgICB5ID0gYFRvdGFsIFRheGFibGUgQXNzZXNzbWVudGAsCiAgICAgICAgICAgICAgICAgIGdyb3VwID0gYFBhcmNlbCBOdW1iZXJgLAogICAgICAgICAgICAgICAgICBjb2xvciA9IGBFYXJsaWVzdCBZZWFyYCkpKwogICAgI2dlb21fcG9pbnQoYWVzKHggPSBhcy5udW1lcmljKGZvcm1hdChgQ3VycmVudCBTYWxlcyBEYXRlYCwiJVkiKSksCiAgICAjICAgICAgICAgICAgICB5ID0gYFRvdGFsIFRheGFibGUgQXNzZXNzbWVudGAsCiAgICAjICAgICAgICAgICAgICBncm91cCA9IGBQYXJjZWwgTnVtYmVyYCkpKwogICAgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSsKICAgIGdndGl0bGUocGFzdGUobmhvb2QpKSsKICAgIHRoZW1lX2RhcmsoKSMrIAogICAgI2ZhY2V0X3dyYXAofmFzLmZhY3Rvcihhcy5udW1lcmljKGZvcm1hdChgQ3VycmVudCBTYWxlcyBEYXRlYCwiJVkiKSkgPj0gMjAwNikpCiAgcmV0dXJuKHApCn0KCmxhcHBseShuZWlnaGJvcmhvb2RzLCBwQXNzZXNzVGltZSkKYGBgClNvIHRoaXMgc2hvd3Mgc29tZSBpbnRlcmVzdGluZyBwYXR0ZXJucy4gRm9yIGhvbWVzIHRoYXQgd2VyZSBub3Qgc29sZCwgdGhlcmUgaXMgb2Z0ZW4gYSBkaXAgaW4gcHJvcGVydHkgdmFsdWVzIHN0YXJ0aW5nIGFmdGVyIDIwMDggYW5kIHJlYWNoaW5nIGEgbWluaW11bSBhcm91bmQgMjAxMi4gVGhpcyBpcyBiZWNhdXNlIGhvbWVvd25lcnMgY2FuIGhhdmUgdGhlaXIgaG9tZXMgcmVhc3Nlc3NlZCBpZiB0aGUgaG91c2UgbG9zZXMgdmFsdWUsIGFuZCB0aGVyZSB3YXMgdGhlIDIwMDggZmluYW5jaWFsIGNyaXNpcy4gKENJVEUpIElmIHRoZSBob3VzaW5nIG1hcmtldCByZWNvdmVycywgdGhlIGhvdXNlIGlzIHJlYXNzZXNzZWQgYnV0IG9ubHkgdG8gd2hhdCB3b3VsZCBiZSBtYXhpbWFsbHkgYWxsb3dlZCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgcHJvcGVydHkgYXNzZXNzbWVudC4gSW4gaG91c2VzIHRoYXQgd2VyZSBzb2xkIGR1cmluZyB0aGlzIHRpbWUgcGVyaW9kLCB0aGVyZSBhcmUgb2Z0ZW4gbGFyZ2UganVtcHMgaW4gdGhlIGFzc2Vzc21lbnQgdmFsdWUuIFRoaXMgaXMgd2hhdCBJIGV4cGVjdGVkLiBUaGUgbnVtYmVyIG9mIGhvdXNlcyB0aGF0IG1haW50YWluZWQgYSBzdGVhZHkgcHJvcGVydHkgZ3Jvd3RoIHJhdGUgc3VycHJpc2VkIG1lLiBNYXliZSB0aGUgZGVwcmVzc2VkIHByb3BlcnR5IHZhbHVlcyBhZnRlciAyMDA4IGNvbnRyaWJ1dGVkIHRvIHRoZXNlIHByb3BlcnRpZXMgbm90IGdhaW5pbmcgZ3JlYXRseSBpbiB2YWx1ZS4gTWF5YmUgdGhlIG5ldyBvd25lcnMgYmVuZWZpdHRlZCBmcm9tIHRyYW5zZmVyaW5nIHRoZWlyIG9sZCBwcm9wZXJ0eSBhc3Nlc3NtZW50IChDSVRFKS4gTWF5YmUgdGhlIHByb3BlcnR5IHdhcyBzb2xkIHRvIGEgY2hpbGQgb3IgZ3JhbmRjaGlsZCwgd2hvIHdvdWxkIGJlIGFsbG93ZWQgdG8ga2VlcCB0aGUgbG93ZXIgYXNzZXNzbWVudCAoQ0lURSkuIAoKKFdPUkQgVEhJUyBCRVRURVIpIEknbSBnb2luZyB0byBmaXQgZWFjaCBwcm9wZXJ0eSB3aXRoIGEgbGluZWFyIHJlZ3Jlc3Npb24gdG8gc2VlIHdoYXQgdGhlIGF2ZXJhZ2UgaW5jcmVhc2UgaW4gdmFsdWUgcGVyIHllYXIgaXMgYmV0d2VlbiAyMDA4IGFuZCAyMDE2LiBUaGVuIEkgY2FuIHNlZSB3aGF0IG5laWdoYm9yaG9vZHMgb3IgcGVyaGFwcyBjaGFyYWN0ZXJpc3RpY3Mgb2YgaG91c2VzIGNvcnJlbGF0ZSB3aXRoIGluY3JlYXNpbmcgb3Igc3RhYmxlIHRheGFibGUgYXNzZXNzbWVudHMuIAoKYGBge3J9CnNsb3BlcyA9IGRhdF9ob19hbGxfc3ViICU+JSAKICBncm91cF9ieShgUGFyY2VsIE51bWJlcmApICU+JQogIHN1bW1hcmlzZShzbG9wZSA9IGxtKGBUb3RhbCBUYXhhYmxlIEFzc2Vzc21lbnRgfmBDbG9zZWQgUm9sbCBZZWFyYCkkY29lZmZpY2llbnRzW1syXV0pCgpkYXRfaG9fYWxsX3N1Yl9zbG9wZXMgPSBzbG9wZXMgJT4lCiAgbGVmdF9qb2luKGRhdF9ob19hbGxfc3ViLCBieSA9ICJQYXJjZWwgTnVtYmVyIikKCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gc2xvcGVzICU+JSBmaWx0ZXIoYHNsb3BlYCA8IDQwMDAwMCAmIGBzbG9wZWAgPiAtMTAwMDAwKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBgc2xvcGVgKSwKICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IDEwMDApKwogIHNjYWxlX3lfbG9nMTAoKQpnZ3Bsb3QoZGF0YSA9IHNsb3BlcyAlPiUgZmlsdGVyKGBzbG9wZWAgPCA0MDAwMDAgJiBgc2xvcGVgID4gLTEwMDAwMCkpKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gYHNsb3BlYCksCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAxMDAwKQpgYGAKCgpgYGB7cn0KbmVpZ2hib3Job29kcyA9IHVuaXF1ZShkYXRfaG9fYWxsX3N1Yl9zbG9wZXMkYEFuYWx5c2lzIE5laWdoYm9yaG9vZGApCgpwQXNzZXNzVGltZSA9IGZ1bmN0aW9uKG5ob29kKXsKICBjdXJyZGF0ID0gZGF0X2hvX2FsbF9zdWJfc2xvcGVzICU+JSBmaWx0ZXIoYEFuYWx5c2lzIE5laWdoYm9yaG9vZGAgPT0gbmhvb2QpCiAgcCA9IGdncGxvdChkYXRhID0gY3VycmRhdCkgKwogICAgZ2VvbV9qaXR0ZXIoYWVzKHggPSAxLAogICAgICAgICAgICAgICAgICB5ID0gYHNsb3BlYCwKICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBgUGFyY2VsIE51bWJlcmAsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gYEVhcmxpZXN0IFllYXJgKSkrCiAgICBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpKwogICAgZ2d0aXRsZShwYXN0ZShuaG9vZCkpKwogICAgdGhlbWVfZGFyaygpKyAKICAgIGZhY2V0X3dyYXAofmFzLmZhY3RvcihgQ3VycmVudCBTYWxlcyBEYXRlYCA+PSAyMDA2KSkKICByZXR1cm4ocCkKfQoKbGFwcGx5KG5laWdoYm9yaG9vZHMsIHBBc3Nlc3NUaW1lKQpgYGAKCmBgYHtyfQpvcHRpb25zKGRpZ2l0cyA9IDE1KQpnZXRfbGF0ID0gZnVuY3Rpb24oZ2VvKXsKICBsYXQgPSBzdHJzcGxpdChnZW8sICJbKCwpXSIpW1sxXV1bMl0KICBsYXQgPSBhcy5kb3VibGUobGF0LCBsZW5ndGggPSAxNSkKICByZXR1cm4obGF0KQp9CmdldF9sb25nID0gZnVuY3Rpb24oZ2VvKXsKICBsb25nID0gc3Ryc3BsaXQoZ2VvLCAiWygsKV0iKVtbMV1dWzNdCiAgbG9uZyA9IGFzLmRvdWJsZShsb25nLCBsZW5ndGggPSAxNSkKICByZXR1cm4obG9uZykKfQojbGF0cyA9IGxhcHBseShkYXRfaG9fYWxsX3N1Yl9zbG9wZXMkdGhlX2dlb20sIGdldF9sYXQpCiNsb25ncyA9IGxhcHBseShkYXRfaG9fYWxsX3N1Yl9zbG9wZXMkdGhlX2dlb20sIGdldF9sb25nKQpkYXRfaG9fYWxsX3N1Yl9zbG9wZXMgPSBkYXRfaG9fYWxsX3N1Yl9zbG9wZXMgJT4lIAogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUobGF0ID0gZ2V0X2xhdCh0aGVfZ2VvbSksCiAgICAgICAgIGxvbmcgPSBnZXRfbG9uZyh0aGVfZ2VvbSkpCmBgYAoKYGBge3J9CgpzZm1hcCA9IG1hcF9kYXRhKCJjb3VudHkiLCByZWdpb24gPSAiQ2FsaWZvcm5pYSIpICU+JSBmaWx0ZXIoc3VicmVnaW9uID09ICJzYW4gZnJhbmNpc2NvIikKcCA9IGdncGxvdCgpKwogIGdlb21fcG9seWdvbihkYXRhID0gc2ZtYXAsIAogICAgICAgICAgICAgICBhZXMoeD1sb25nLCB5ID0gbGF0KSkKcAoKY3VycmRhdCA9IGRhdF9zdWIgJT4lIGZpbHRlcihgQ2xvc2VkIFJvbGwgWWVhcmAgPT0gMjAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTbG9wZSBQZXJjZW50IERpZmZlcmVuY2VgID49IDApCnAgPSBnZ3Bsb3QoKSsKICBnZW9tX3BvaW50KGRhdGEgPSBjdXJyZGF0LAogICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBgU2xvcGUgUGVyY2VudCBEaWZmZXJlbmNlYCkpKwogICNzY2FsZV9jb2xvcl9ncmFkaWVudG4odHJhbnMgPSAibG9nIiwgY29sb3JzID0gcmFpbmJvdyg5KSkrCiAgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiLCB0cmFucyA9ICJsb2ciKSsKICBjb29yZF9tYXAoKQpwCgpwID0gZ2dwbG90KCkrCiAgZ2VvbV9wb2ludChkYXRhID0gY3VycmRhdCwKICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICAgIGNvbG9yID0gYFNsb3BlIFBlcmNlbnQgRGlmZmVyZW5jZWApKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4odHJhbnMgPSAibG9nIiwgY29sb3JzID0gcmV2KHJhaW5ib3coOSkpKSsKICBjb29yZF9tYXAoKQpwCgpgYGAKCmBgYHtyfQpuZWlnaGJvcmhvb2RzID0gdW5pcXVlKGRhdF9ob19hbGxfc3ViX3Nsb3BlcyRgQW5hbHlzaXMgTmVpZ2hib3Job29kYCkKcExvY2F0aW9uID0gZnVuY3Rpb24obmhvb2QpewogIGN1cnJkYXQgPSBkYXRfaG9fYWxsX3N1Yl9zbG9wZXMgJT4lIGZpbHRlcihgQW5hbHlzaXMgTmVpZ2hib3Job29kYCA9PSBuaG9vZCkKICBwID0gZ2dwbG90KGRhdGEgPSBjdXJyZGF0KSArCiAgICBnZW9tX2ppdHRlcihhZXMoeCA9IDEsCiAgICAgICAgICAgICAgICAgIHkgPSBgc2xvcGVgLAogICAgICAgICAgICAgICAgICBncm91cCA9IGBQYXJjZWwgTnVtYmVyYCwKICAgICAgICAgICAgICAgICAgY29sb3IgPSBgRWFybGllc3QgWWVhcmApKSsKICAgIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlID0gIlNwZWN0cmFsIikrCiAgICBnZ3RpdGxlKHBhc3RlKG5ob29kKSkrCiAgICB0aGVtZV9kYXJrKCkrIAogICAgZmFjZXRfd3JhcCh+YXMuZmFjdG9yKGBDdXJyZW50IFNhbGVzIERhdGVgID49IDIwMDYpKQogIHJldHVybihwKQp9CgpsYXBwbHkobmVpZ2hib3Job29kcywgcEFzc2Vzc1RpbWUpCmBgYAoKCmBgYHtyfQpkYXRfaG9fMjAxNl9zdWIyICA9IGRhdF9ob18yMDE2X3N1YiAlPiUgZmlsdGVyKGBUb3RhbCBUYXhhYmxlIEFzc2Vzc21lbnQgUGVyY2VudCBEaWZmZXJlbmNlIEZyb20gMjAxMmAgPiAxMDAwICYgYFRvdGFsIFRheGFibGUgQXNzZXNzbWVudGAgPDMwMDAwMDApCgpwID0gZ2dwbG90KGRhdGEgPSBkYXRfaG9fYWxsX3N1YiAlPiUgZmlsdGVyKGBQYXJjZWwgTnVtYmVyYCAlaW4lIGRhdF9ob18yMDE2X3N1YjIkYFBhcmNlbCBOdW1iZXJgKSkgKwogIGdlb21fbGluZShhZXMoeCA9IGBDbG9zZWQgUm9sbCBZZWFyYCwKICAgICAgICAgICAgICAgIHkgPSBgVG90YWwgVGF4YWJsZSBBc3Nlc3NtZW50YCwKICAgICAgICAgICAgICAgIGdyb3VwID0gYFBhcmNlbCBOdW1iZXJgLAogICAgICAgICAgICAgICAgY29sb3IgPSBgWWVhciBQcm9wZXJ0eSBCdWlsdGApKSsKICBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpKwogIHRoZW1lX2RhcmsoKQogICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCnAKCnBBc3Nlc3NFYXJsaWVzdERhdGUgPSBmdW5jdGlvbihuaG9vZCl7CiAgY3VycmRhdCA9IGRhdF9ob19hbGxfc3ViICU+JSBmaWx0ZXIoYEFuYWx5c2lzIE5laWdoYm9yaG9vZGAgPT0gbmhvb2QpCiAgcCA9IGdncGxvdChkYXRhID0gY3VycmRhdCAlPiUgZmlsdGVyKGBQYXJjZWwgTnVtYmVyYCAlaW4lIGRhdF9ob18yMDE2X3N1YjIkYFBhcmNlbCBOdW1iZXJgKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBgQ3VycmVudCBTYWxlcyBEYXRlYCwKICAgICAgICAgICAgICAgIHkgPSBgVG90YWwgVGF4YWJsZSBBc3Nlc3NtZW50YCwKICAgICAgICAgICAgICAgIGdyb3VwID0gYFBhcmNlbCBOdW1iZXJgLAogICAgICAgICAgICAgICAgY29sb3IgPSBgRWFybGllc3QgWWVhcmApKSsKICBzY2FsZV94X2RhdGUoKSsKICBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpKwogIHRoZW1lX2RhcmsoKSsKICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogIHJldHVybihwKQp9CmxhcHBseShuZWlnaGJvcmhvb2RzWzE6M10sIHBBc3Nlc3NFYXJsaWVzdERhdGUpCgoKcCA9IGdncGxvdChkYXRhID0gZGF0X2hvX2FsbF9zdWJfc2xvcGVzICU+JSBmaWx0ZXIoYHNsb3BlYCA8IDQwMDAwMCAmIGBzbG9wZWAgPiAwKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBgRWFybGllc3QgWWVhcmAsCiAgICAgICAgICAgICAgICB5ID0gYEN1cnJlbnQgU2FsZXMgRGF0ZWAsCiAgICAgICAgICAgICAgICBjb2xvciA9IGBzbG9wZWApKSsKICBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpKwogIHNjYWxlX3lfZGF0ZSgpCnAKYGBgCgoKIyMjIE1vcmUgcXVlc3Rpb25zIHRvIGV4cGxvcmUKIyMjIzEuIFdobyBpcyByZW50IGNvbnRyb2wgYmVuZWZpdGluZz8gCiAgLSBXaGF0IGFyZSB0aGUgaW5jb21lcyBvZiBwZW9wbGUgd2hvIGFyZSBpbiByZW50IGNvbnRyb2w/CiAgLSBXaGF0IGFyZSB0aGUgcmVudHMgb2YgcmVudCBjb250cm9sIHVuaXRzPwogIC0gQXJlIHBlb3BsZSBpbiByZW50IGNvbnRyb2wgdXNpbmcgb3RoZXIgY2l0eSBwcm9ncmFtcz8KICAtIENhbiBJIGZpbmQgb3V0IGlmIHNvbWUgcGVvcGxlIHdobyBoYXZlIHJlbnQgY29udHJvbCwgb3duIGhvbWVzIGVsc2V3aGVyZT8KICAtIEFyZSByZW50IGNvbnRyb2xsZWQgaG9tZXMgbW9yZSAiZGVyZWxpY3Q/IgogIC0gRG8gcmVudCBjb250cm9sbGVkIHVuaXRzIHJlbnQgZm9yIGEgcHJlbWl1bT8KICAtIFdoYXQgYWJvdXQgcGVvcGxlIHdpdGhvdXQgcmVudCBjb250cm9sLiBBcmUgdGhleSBtb3JlIGxpa2VseSB0byBoYXZlIHJvb21hdGVzPwogIC0gT3IgYmUgd2VhbHRoaWVyPwogIC0gT3IgbW92ZSBtb3JlIG9mdGVuPwogIC0gRG9lcyByZW50IGNvbnRyb2wgY2hhbmdlIG9yIGNvcnJlbGF0ZSB3aXRoIGNlcnRhaW4gYmVoYXZpb3JzPwoKIyMjIzIuIE9mIHBlb3BsZSB3aG8gb3duIGhvbWVzOgogIC0gSG93IGxvbmcgaGF2ZSB0aGV5IGJlZW4gdGhlcmU/CiAgLSBXaGF0IHRheGVzIGFyZSBwZW9wbGUgcGF5aW5nPwogIC0gV2hhdCBhcmUgdGhlIGluY29tZXMgb2YgcGVvcGxlIHdobyBvd24/CiAgLSBWYXJpYWJsZXMgdG8gZXhwbG9yZTogaW5jb21lLCB5ZWFyIHB1cmNoYXNlZCwgdGF4ZXMgcGFpZAogIAojIyMjMy4gSG9tZXMgYW5kIGFwYXJ0bWVudHMgaW4gZ2VuZXJhbC4gV2hhdCBkb2VzIHR1cm5vdmVyIGxvb2sgbGlrZT8KICAtIEhvdyBvZnRlbi93ZXJlIGFyZSBob21lcyBiZWluZyBzb2xkPyAKICAtIEhvdyBvZnRlbi93ZXJlIGFyZSBob21lcyBzb2xkIHRvIGZvcmVpZ24gYnV5ZXJzPwogIC0gSG93IG9mdGVuL3doZXJlIGFyZSBob21lcyBwdXQgb24gQWlyQm5CIG9yIFZSQk8gYXMgc2hvcnQgdGVybSByZW50YWxzPwogIC0gV2hhdHMgdGhlIGhpc3RvcmljYWwgdHJlbmQgb2YgaG91c2VzIGJlaW5nIGNvbmRvIGNvbnZlcnRlZD8K